﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using DECOR.BL.BE;
using DECOR.BL.BC;
using System.Collections.Generic;
using CM.BL.BE;

namespace DECOR.WebApp
{
    public partial class Stock : System.Web.UI.Page
    {
        #region TreeView Jerarquias
        protected void tvJerarquia_SelectedNodeChanged(object sender, EventArgs e)
        {
            //codigo para buscar materiales...
            this.buscaMateriales();
        }

        protected void tvJerarquia_TreeNodePopulate(object sender, TreeNodeEventArgs e)
        {
            if (e.Node.Value == "0")
            {
                List<JerarquiaBE> lstNivel1 = JerarquiaBC.Instance.listar(1);
                foreach (JerarquiaBE obj in lstNivel1)
                {
                    TreeNode root = new TreeNode(obj.Descripcion, obj.Jerarquia + ':' + obj.Nivel.ToString());
                    root.PopulateOnDemand = true;
                    e.Node.ChildNodes.Add(root);
                }
            }
            else
            {
                string[] aux = e.Node.Value.Split(':');
                List<JerarquiaBE> lstNiveli = JerarquiaBC.Instance.Buscar(Convert.ToInt32(aux[1]) + 1, aux[0]);
                foreach (JerarquiaBE obj in lstNiveli)
                {
                    TreeNode node = new TreeNode(obj.Descripcion, obj.Jerarquia + ':' + obj.Nivel.ToString());
                    node.PopulateOnDemand = true;
                    e.Node.ChildNodes.Add(node);
                }
            }
        }
        private void tvJerarquiasRender()
        {
            TreeNode tn = new TreeNode("TODAS", "0");
            tn.PopulateOnDemand = true;
            tn.Selected = true;
            tvJerarquia.Nodes.Add(tn);
        }
        #endregion

		decimal _totStockLibre = 0m, _totStockPedidoCliente = 0m, _totStockEntregaCliente = 0m;
        decimal _totStockDisponible = 0m, _totStockEnTransito = 0m;
        PedidoBE _lvObjPedido;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                RfcConfigParametersBE objUsuarioWeb = (RfcConfigParametersBE)Session["UsuarioWeb"];


                //cmbOrgVentas.Text = objUsuarioWeb.OrgVentas;
                this.cargaDatos();
                this.tvJerarquiasRender();
                //cmbCanalDist.Text = objUsuarioWeb.CanalDist == "" ? "10" : objUsuarioWeb.CanalDist;

                this.buscaMateriales();
                VerificaOpcionesUsuario(); //WEBDIST
            }
        }

        //WEBDIST
        private void VerificaOpcionesUsuario()
        {
            List<string> lstOpciones;
            if (Session["Opciones"] == null)
                return;
            else
                lstOpciones = (List<string>)Session["Opciones"];

            if (lstOpciones.Contains("ZCMATNR_03"))
                txtCodMaterial.Enabled = true;
            else
                txtCodMaterial.Enabled = false;

            if (lstOpciones.Contains("ZCMATNR_04"))
                txtMaterial.Enabled = true;
            else
                txtMaterial.Enabled = false;

            if (lstOpciones.Contains("ZCMATNR_05"))
                txtCodMaterialAntiguo.Enabled = true;
            else
                txtCodMaterialAntiguo.Enabled = false;

            if (lstOpciones.Contains("ZCMATNR_06"))
                tvJerarquia.Enabled = true;
            else
                tvJerarquia.Enabled = false;

            if (lstOpciones.Contains("ZCMATNR_07"))
                cmbOrgVentas.Enabled = true;
            else
                cmbOrgVentas.Enabled = false;

            if (lstOpciones.Contains("ZCMATNR_08"))
                cmbCentro.Enabled = true;
            else
                cmbCentro.Enabled = false;

            if (lstOpciones.Contains("ZCMATNR_09"))
                cmbAlmacen.Enabled = true;
            else
                cmbAlmacen.Enabled = false;
            if (Session["usuarioDistribucion"].ToString() != "ok")
            {
                if (lstOpciones.Contains("ZCSTOCK_01"))
                    lnkBuscarStock.Visible = true;
                //cgvMateriales.Columns[8].Visible = true;
                else
                    lnkBuscarStock.Visible = false;
                //cgvMateriales.Columns[8].Visible = false;

                if (lstOpciones.Contains("ZCSTOCK_02"))
                    cgvMateriales.Columns[0].Visible = true;
                else
                    cgvMateriales.Columns[0].Visible = false;

                if (lstOpciones.Contains("ZCSTOCK_03"))
                {
                    //cgvMateriales.Columns[1].Visible = true;
                }
                else
                {
                    //cgvMateriales.Columns[1].Visible = false;
                }
            }
            else
            {
                cgvMateriales.Columns[0].Visible = false;
                //cgvMateriales.Columns[1].Visible = false;
            }
            
        }

        private void buscaMateriales()
        {
            try
            {
                string[] aux = tvJerarquia.SelectedNode.Value.Split(':');
                aux[0] = aux[0] == "0" ? "" : aux[0];

                //WEBDIST
                List<MaterialBE> dt = new List<MaterialBE>();
                RfcConfigParametersBE objUsuarioWeb = (RfcConfigParametersBE)Session["UsuarioWeb"];
                if (txtCodMaterial.Text == string.Empty)
                {
                    dt = MaterialBC.Instance.buscarMateriales(txtCodMaterialAntiguo.Text.Trim(), txtMaterial.Text.Trim(), aux[0], cmbOrgVentas.Text.Trim(), cmbCanalDist.Text == "" ? "10" : cmbCanalDist.Text, objUsuarioWeb.UsuarioWEB);
                }
                else
                {
                    MaterialBE itm = null;
                    PedidoBE pe = (PedidoBE)Session["Pedido"];
                    if (pe != null && !pe.CanalDist.Equals(""))
                        itm = MaterialBC.Instance.leerMaterial(txtCodMaterial.Text, cmbOrgVentas.SelectedValue, pe.CanalDist, objUsuarioWeb.UsuarioWEB);//objUsuarioWeb.Uname);
                    else
                        itm = MaterialBC.Instance.leerMaterial(txtCodMaterial.Text, cmbOrgVentas.SelectedValue, "10", objUsuarioWeb.UsuarioWEB);//objUsuarioWeb.Uname);

                    if (itm != null)
                        dt.Add(itm);
                }

                if (dt.Count == 0)
                {
                    Session["Mensaje"] = "No se han encontrado materiales.";
                }

                string charStockMax = ParametroBC.Instance.getParamValue("stockMayor");
                //validamos que sea un usuario de distribucion
                if (Session["usuarioDistribucion"] != null)
                {
                    if (Session["usuarioDistribucion"].ToString() == "ok")
                    {
                        foreach (MaterialBE item in dt)
                        {                            
                            item.sStock = (item.Stock > Convert.ToDecimal(charStockMax)) ? "> " + charStockMax : item.Stock.ToString();
                        }
                    }
                    else
                    {
                        foreach (MaterialBE item in dt)
                        {
                            item.sStock = item.Stock.ToString();
                        }
                    }
                }
                

                Session["LMaterialBE"] = dt;
                cgvMateriales.DataSource = dt;
                cgvMateriales.DataBind();

                if (Session["PedidoTratado"] != null)
                    if ((bool)Session["PedidoTratado"])
                        cgvMateriales.Columns[1].Visible = false;
            }
            catch (Exception ex)
            {
                Session["Mensaje"] = ex.Message;
            }
            finally
            {
                ((Site2)Master).muestraMensajes();
            }
        }

        protected void cmbOrgVtas_SelectedIndexChanged(object sender, EventArgs e)
    {
                List<GenericBE> lstCanalDist = ClienteBC.Instance.listaCanalDist("", cmbOrgVentas.SelectedValue);

                cmbCanalDist.DataValueField = "Codigo";
                cmbCanalDist.DataTextField = "Descripcion";
                cmbCanalDist.DataSource = lstCanalDist;
                cmbCanalDist.DataBind();

                if (lstCanalDist.Count > 0)
                {
                    cmbCanalDist.SelectedIndex = 0;
                }

  
        }



        protected void ibtnBuscar_Click(object sender, ImageClickEventArgs e)
        {
            buscaMateriales(); //WEBDIST
            //List<MaterialBE> dt=new List<MaterialBE>();

            //try
            //{
            //    UsuarioWebBE objUsuarioWeb = (UsuarioWebBE)Session["UsuarioWeb"]; //WEBDIST
            //    if (txtCodMaterial.Text == string.Empty)
            //    {
            //        string[] aux = tvJerarquia.SelectedNode.Value.Split(':');
            //        aux[0] = aux[0] == "0" ? "" : aux[0];

            //        //WEBDIST
            //        dt = MaterialBC.Instance.buscarMateriales(txtCodMaterialAntiguo.Text.Trim(), txtMaterial.Text.Trim(),
            //                                                                    aux[0], cmbOrgVentas.Text.Trim(), "10", objUsuarioWeb.Usuario);

            //        if (dt.Count == 0)
            //        {
            //            Session["Mensaje"] = "No se han encontrado materiales.";
            //        }
            //    }
            //    else {
            //                MaterialBE itm = null;
            //                PedidoBE pe = (PedidoBE)Session["Pedido"];
            //                if (!pe.CanalDist.Equals(""))
            //                {

            //                    itm = MaterialBC.Instance.leerMaterial(txtCodMaterial.Text, cmbOrgVentas.SelectedValue, pe.CanalDist, objUsuarioWeb.Usuario); //WEBDIST
            //                }
            //                else
            //                {
            //                    itm = MaterialBC.Instance.leerMaterial(txtCodMaterial.Text, cmbOrgVentas.SelectedValue, "10", objUsuarioWeb.Usuario); //WEBDIST
            //                }


            //                if (itm != null)
            //                {
            //                    dt.Add(itm);
            //                }
            //                if (dt.Count == 0)
            //                {
            //                    Session["Mensaje"] = "No se han encontrado materiales.";
            //                }
                
            //    }

            //    Session["LMaterialBE"] = dt;
            //    cgvMateriales.DataSource = dt;
            //    cgvMateriales.DataBind();

            //    if (Session["PedidoTratado"] != null)
            //        if ((bool)Session["PedidoTratado"])
            //            cgvMateriales.Columns[2].Visible = false;
            //}
            //catch (Exception ex)
            //{
            //    Session["Mensaje"] = ex.Message;
            //}
            //finally
            //{
            //    ((Site2)Master).muestraMensajes();
            //}
            
        }

	    private void cargaDatos()
        {
            
            List<GenericBE> lst_OrgVentas= null;
            List<GenericBE> lst_CanalDist = null;

            if (Session["Pedido"] != null)
            { 

                this._lvObjPedido = (PedidoBE)Session["Pedido"];
                if ((!string.IsNullOrEmpty(this._lvObjPedido.CodCliente)) && (Int64.Parse(this._lvObjPedido.CodCliente) > 0))
                {
                    lst_OrgVentas = ClienteBC.Instance.listaOrgVtas(this._lvObjPedido.CodCliente);
                    lst_CanalDist = ClienteBC.Instance.listaCanalDist(!string.IsNullOrEmpty(this._lvObjPedido.CodCliente) ? this._lvObjPedido.CodCliente : "", !string.IsNullOrEmpty(this._lvObjPedido.OrgVentas) ? this._lvObjPedido.OrgVentas : "1000");
                }
                else{
                    lst_OrgVentas = ClienteBC.Instance.listaOrgVtas("");
                }
                 //cmbOrgVentas.Text = !string.IsNullOrEmpty(this._lvObjPedido.OrgVentas) ? this._lvObjPedido.OrgVentas : cmbOrgVentas.Text;
                 //cmbCanalDist.Text = !string.IsNullOrEmpty(this._lvObjPedido.CanalDist) ? this._lvObjPedido.CanalDist : cmbCanalDist.Text;

                if (this._lvObjPedido.Detalle != null && this._lvObjPedido.Detalle.Count > 0)
                {
                    dlMaterialesSelec.ShowFooter = false;
                    dlMaterialesSelec.DataSource = this._lvObjPedido.Detalle;
                }
                else
                {
                    dlMaterialesSelec.ShowFooter = true;
                    dlMaterialesSelec.DataSource = new DataTable();
                }
                dlMaterialesSelec.DataBind();
            }
            else { 
                lst_OrgVentas = ClienteBC.Instance.listaOrgVtas( "");
                lst_CanalDist = ClienteBC.Instance.listaCanalDist("","1000");
            }

            if ((lst_OrgVentas != null) && (lst_OrgVentas.Count > 0))
            {
                cmbOrgVentas.DataSource = lst_OrgVentas;
                cmbOrgVentas.DataValueField = "Codigo";
                cmbOrgVentas.DataTextField = "Descripcion";
                cmbOrgVentas.DataBind();

                if (_lvObjPedido!=null)
                    cmbOrgVentas.SelectedValue = !string.IsNullOrEmpty(this._lvObjPedido.OrgVentas) ? this._lvObjPedido.OrgVentas : "1000";
                else
                    cmbOrgVentas.SelectedValue = "1000";
            }
            if ((lst_CanalDist != null) && (lst_CanalDist.Count>0))
            {
                cmbCanalDist.DataSource = lst_CanalDist;
                cmbCanalDist.DataValueField = "Codigo";
                cmbCanalDist.DataTextField = "Descripcion";
                cmbCanalDist.DataBind();

                if (_lvObjPedido != null)
                    cmbCanalDist.SelectedValue = !string.IsNullOrEmpty(this._lvObjPedido.CanalDist) ? this._lvObjPedido.CanalDist : "10";
                else
                    cmbCanalDist.SelectedValue = "10";
            }
            
            List<GenericBE> lstCentros = CentroBC.Instance.listar();
            cmbCentro.DataValueField = "Codigo";
            cmbCentro.DataTextField = "Descripcion";
            cmbCentro.DataSource = lstCentros;
            cmbCentro.DataBind();
            cmbCentro.Text = "";

            List<GenericBE> lstAlmacenes = AlmacenBC.Instance.listar("");
            cmbAlmacen.DataValueField = "Codigo";
            cmbAlmacen.DataTextField = "Descripcion";
            cmbAlmacen.DataSource = lstAlmacenes;
            cmbAlmacen.DataBind();
            cmbAlmacen.Text = "";
        }

        protected void txtMaterial_TextChanged(object sender, EventArgs e)
        {
            this.buscaMateriales();
        }

        protected void txtCodMaterial_TextChanged(object sender, EventArgs e)
        {
            //WEBDIST
            this.buscaMateriales();
            //if (txtCodMaterial.Text == string.Empty)
            //{
            //    this.buscaMateriales();
            //}
            //else
            //{
            //    MaterialBE itm = null;
            //    List<MaterialBE> dt = new List<MaterialBE>();
            //    PedidoBE pe = (PedidoBE)Session["Pedido"];
            //    if (!pe.CanalDist.Equals(""))
            //    {

            //        itm = MaterialBC.Instance.leerMaterial(txtCodMaterial.Text, cmbOrgVentas.SelectedValue, pe.CanalDist); 
            //    }
            //    else
            //    {
            //        itm = MaterialBC.Instance.leerMaterial(txtCodMaterial.Text, cmbOrgVentas.SelectedValue, "10", obju);
            //    }

                
            //    if (itm != null)
            //    {
            //        dt.Add(itm);
            //    }
            //    if (dt.Count == 0)
            //    {
            //        Session["Mensaje"] = "No se han encontrado materiales.";
            //    }


            //    Session["LMaterialBE"] = dt;
               
            //    cgvMateriales.DataSource = dt;
            //    cgvMateriales.DataBind();
            //}
        }

        protected void cgvMateriales_DataBound(object sender, EventArgs e)
        {
            string op = "";
            if (Session["Operacion"] != null)
            {
                op = Session["Operacion"].ToString().ToLower();
                if (Session["Pedido"] != null && Session["Cliente"] != null)
                {
                    PedidoBE objPedido = (PedidoBE)Session["Pedido"];
                    if (!string.IsNullOrEmpty(objPedido.CodTipoDoc) &&
                        !ParametroBC.Instance.esTipoX(objPedido.CodTipoDoc, "CodNCND"))
                    {
                        cgvMateriales.Columns[1].Visible = true;
                    }
                }
            }
        }

        private void calculaFechaEntregaItem(DetalleBE objDetalle)
        {
            DateTime fechaCalculada, fechaActual = DateTime.Today;
            double factor = 0;
            //----

            //if (objDetalle.PrioridadEntrega == "01" || objDetalle.PrioridadEntrega == "04")//normal +2
            //{
            //    factor = 2;
            //}
            //else if (objDetalle.PrioridadEntrega == "02")//express +1
            //{
            //    factor = 1;
            //}
            if (ParametroBC.Instance.esTipoX(objDetalle.PrioridadEntrega, "CodPrioEntMas2"))
            {
                factor = 2;
            }
            else if (ParametroBC.Instance.esTipoX(objDetalle.PrioridadEntrega, "CodPrioEntMas1"))
            {
                factor = 1;
            }
            else
            {
                factor = 0;
            }
            //-----
            int count = Convert.ToInt32(factor);
            //Si es domingo pasa como si fuera lunes
            if (fechaActual.DayOfWeek == DayOfWeek.Sunday)
            {
                count += 1;
            }
            fechaCalculada = fechaActual;
            for (int i = 1; i <= count; i++)
            {
                fechaCalculada = fechaCalculada.AddDays(1);
                if (fechaCalculada.DayOfWeek == DayOfWeek.Sunday)
                {
                    fechaCalculada = fechaCalculada.AddDays(1);
                }
            }

            //--- con una sola fecha de reparto:
            //if (fechaCalculada > objDetalle.FechaEntrega)
            //{
            //    objDetalle.FechaEntrega = fechaCalculada;
            //}
            //else if (objDetalle.FechaEntrega.DayOfWeek == DayOfWeek.Sunday)
            //{
            //    objDetalle.FechaEntrega = objDetalle.FechaEntrega.AddDays(1);
            //}

            //--- múltiples fechas de reparto:
            if (objDetalle.Repartos.Count == 0) { objDetalle.Repartos.Add(new RepartoBE()); }
            foreach (RepartoBE itmRep in objDetalle.Repartos)
            {
                if (fechaCalculada > itmRep.FechaEntrega)
                {
                    itmRep.FechaEntrega = fechaCalculada;
                }
                else if (itmRep.FechaEntrega.DayOfWeek == DayOfWeek.Sunday)
                {
                    itmRep.FechaEntrega = itmRep.FechaEntrega.AddDays(1);
                }
            }
        }

        private string addItem(string pCodMat, decimal pCant)
        {
            string retMsg = "";

            try
            {
                this._lvObjPedido = (PedidoBE)Session["Pedido"];
                


                List<DetalleBE> lstMateriales = (this._lvObjPedido.Detalle == null) ? new List<DetalleBE>() : this._lvObjPedido.Detalle;

                DetalleBE objDetalle = new DetalleBE();
                objDetalle.CodMaterial = pCodMat;
                objDetalle.Cantidad = pCant;

                MaterialBE objMaterial = null;
                
                if (Session["LMaterialBE"] == null)
                {
                    objMaterial = MaterialBC.Instance.leerMaterial(objDetalle.CodMaterial, this._lvObjPedido.OrgVentas, this._lvObjPedido.CanalDist);
                }
                else
                {
                    objMaterial = ((List<MaterialBE>)Session["LMaterialBE"]).Find(x => x.CodMaterial == objDetalle.CodMaterial);
                    objMaterial = objMaterial == null ? MaterialBC.Instance.leerMaterial(objDetalle.CodMaterial, this._lvObjPedido.OrgVentas, this._lvObjPedido.CanalDist) : objMaterial;
                }

                
                if (objMaterial != null)
                {
                    objDetalle.DescMaterial = objMaterial.DescMaterial;
                    objDetalle.CodUMedida = objMaterial.CodUMedida;
                    objDetalle.Peso = objMaterial.Peso;
                    objDetalle.UMedidaRendimiendo = objMaterial.UMedidaRendimiendo;
                    objDetalle.ValorRendimiento = objMaterial.ValorRendimiento;
                    objDetalle.TipoMaterial = objMaterial.TipoMaterial;

                    objDetalle.Material = objMaterial;

                    //si UM = UNidad => redondear al entero mayor
                    if (ParametroBC.Instance.esTipoX(objDetalle.CodUMedida, "UMUnidad"))
                    {
                        objDetalle.Cantidad = (objDetalle.Cantidad > decimal.Truncate(objDetalle.Cantidad)) ? decimal.Truncate(objDetalle.Cantidad) + 1 : objDetalle.Cantidad;
                    }
                    //--- calcular rendimiento
                    if (!ParametroBC.Instance.esTipoX(objDetalle.Material.Tipo, "TipoMatServicio") &&
                        ParametroBC.Instance.esTipoX(objDetalle.Material.UMedidaRendimiendo, "UMRendimiento"))
                    {
                        objDetalle.Cantidad = this.calculaRendimiento(objDetalle.Cantidad, objDetalle.ValorRendimiento);
                    }

                    bool auxC = false;
                    //--- cargar data de prioridad de entrega en base a la cond de exp.
                    if (!string.IsNullOrEmpty(this._lvObjPedido.CondExp))
                    {
                        objDetalle.PrioridadEntrega = this._lvObjPedido.CondExp;
                        auxC = true;
                    }
                    /*20110714 Inicio WCA  */
                    string canalesCondDesNor = ParametroBC.Instance.getParamValue("CondPriorDespNormal");
                    if (!string.IsNullOrEmpty(canalesCondDesNor))
                    {
                        string[] aCanalCond = canalesCondDesNor.Split(',');
                        for (int iCan = 0; iCan < aCanalCond.Length; iCan++)
                        {

                            if (aCanalCond[iCan].Equals(this.cmbCanalDist.SelectedValue) || aCanalCond[iCan].Equals(_lvObjPedido.CanalDist))
                            {
                                objDetalle.PrioridadEntrega = ParametroBC.Instance.getParamValue("PriorDetReparto");
                                break;
                            }
                        }

                    }
                    /*20110714 Fin  */
                    //--- cargar fecha de entrega
                    if (this._lvObjPedido.FechaEntrega != objDetalle.Repartos[0].FechaEntrega)
                    {
                        objDetalle.Repartos[0].FechaEntrega = this._lvObjPedido.FechaEntrega;
                        auxC = true;
                    }
                    if (auxC) { this.calculaFechaEntregaItem(objDetalle); }
                    objDetalle.Repartos[0].CantPed = objDetalle.Cantidad;
                    objDetalle.Repartos[0].CantConf = objDetalle.Cantidad;
                    //--- cálculo de posición
                    string tmpPos = "";
                    if (lstMateriales.Count > 0)
                    {
                        tmpPos = lstMateriales[lstMateriales.Count - 1].Posicion;
                    }
                    else
                    {
                        tmpPos = "00";
                    }
                    int posi = Convert.ToInt16(tmpPos) + 10;
                    objDetalle.Posicion = posi.ToString();

                    lstMateriales.Add(objDetalle);

                    //--- validar si es un material Z004/Z001 combo/kit
                    if (ParametroBC.Instance.esTipoX(objMaterial.Tipo, "TipoMatCombo") &&
                        (((List<EnlaceMaterialBE>)Session["ObjEnla"]).Count == 0 ))
                    {
                        //buscar materiales asociados y añadirlos
                        string pTipoPos = "";
                        List<DetalleBE> lstDetalle = PedidoBC.Instance.buscaTipoPosicion(this._lvObjPedido.CodTipoDoc, objMaterial.CodMaterial, this._lvObjPedido.OrgVentas,
                                                                                         this._lvObjPedido.CanalDist, out pTipoPos);
                        objDetalle.TipoPosicion = pTipoPos.Equals("") ? objDetalle.TipoPosicion : pTipoPos;

                        //--- si tiene elementos, entonces es un KIT o Combo
                        foreach (DetalleBE item in lstDetalle)
                        {
                            item.DescMaterial = item.Material.DescMaterial;
                            item.CodUMedida = item.Material.CodUMedida;
                            item.Peso = item.Material.Peso;
                            item.UMedidaRendimiendo = item.Material.UMedidaRendimiendo;
                            item.ValorRendimiento = item.Material.ValorRendimiento;
                            item.TipoMaterial = item.Material.TipoMaterial;

                            posi += 10;
                            item.Posicion = posi.ToString();
                            item.PosSup = objDetalle.Posicion;

                            item.Cantidad = item.CantComp * objDetalle.Cantidad;
                            //si UM = UNidad => redondear al entero mayor
                            if (ParametroBC.Instance.esTipoX(item.CodUMedida, "UMUnidad"))
                            {
                                item.Cantidad = (item.Cantidad > decimal.Truncate(item.Cantidad)) ? decimal.Truncate(item.Cantidad) + 1 : item.Cantidad;
                            }
                            //--------------------
                            if (item.Material == null)
                            {
                                item.Material = MaterialBC.Instance.leerMaterial(item.CodMaterial, this._lvObjPedido.OrgVentas, this._lvObjPedido.CanalDist);
                            }
                            //--- calcular rendimiento
                            if (!ParametroBC.Instance.esTipoX(item.Material.Tipo, "TipoMatServicio") &&
                                ParametroBC.Instance.esTipoX(item.Material.UMedidaRendimiendo, "UMRendimiento"))
                            {
                                item.Cantidad = this.calculaRendimiento(item.Cantidad, item.ValorRendimiento);
                            }

                            switch (objDetalle.TipoPosicion)
                            {
                                case "Z011":
                                    item.TipoPosicion = "Z012";
                                    break;
                                case "Z016":
                                    item.TipoPosicion = "Z017";
                                    break;
                                case "Z007":
                                    item.TipoPosicion = "Z008";
                                    break;
                                case "Z014":
                                    item.TipoPosicion = "Z015";
                                    break;
                            }

                            auxC = false;
                            //--- cargar data de prioridad de entrega en base a la cond de exp.
                            if (!string.IsNullOrEmpty(this._lvObjPedido.CondExp))
                            {
                                item.PrioridadEntrega = this._lvObjPedido.CondExp;
                                auxC = true;
                            }
                            /*20110714 Inicio WCA  */
                            if (!string.IsNullOrEmpty(canalesCondDesNor))
                            {
                                string[] aCanalCond = canalesCondDesNor.Split(',');
                                for (int iCan = 0; iCan < aCanalCond.Length; iCan++)
                                {
                                    if (aCanalCond[iCan].Equals(this.cmbCanalDist.SelectedValue) || aCanalCond[iCan].Equals(_lvObjPedido.CanalDist))
                                    {
                                        item.PrioridadEntrega = ParametroBC.Instance.getParamValue("PriorDetReparto");
                                        break;
                                    }
                                }

                            }
                            /*20110714 Fin  */
                            //--- cargar fecha de entrega
                            if (this._lvObjPedido.FechaEntrega != objDetalle.Repartos[0].FechaEntrega)
                            {
                                objDetalle.Repartos[0].FechaEntrega = this._lvObjPedido.FechaEntrega;
                                auxC = true;
                            }
                            if (auxC) { this.calculaFechaEntregaItem(item); }
                            objDetalle.Repartos[0].CantPed = item.Cantidad;
                            objDetalle.Repartos[0].CantConf = item.Cantidad;
                            //--- solo agregar los q no hayan sido agregados antes
                            lstMateriales.Add(item);
                        }
                    }
                    this._lvObjPedido.Detalle = lstMateriales;
                    Session["Pedido"] = this._lvObjPedido;
                }
                else
                {
                    retMsg = "No se encontró el material.";
                }
            }
            catch (Exception ex)
            {
                retMsg = ex.Message;
            }
            return retMsg;
        }

        private decimal calculaRendimiento(decimal pCant, decimal pRend)
        {
            if (pRend != 0m)
            {
                decimal residuo = pCant % pRend, ajuste = 0m;
                if (residuo != 0) { ajuste = 1m; }
                decimal nuevaCant = (Math.Truncate(pCant / pRend) + ajuste) * pRend;
                return decimal.Round(nuevaCant, ParametroBC.Instance.getDecimales);
            }
            return decimal.Round(pCant, ParametroBC.Instance.getDecimales);
        }

        protected void cgvMateriales_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                int idx = Convert.ToInt32(e.CommandArgument);
                GridViewRow gvr = cgvMateriales.Rows[idx];
                string mID = gvr.Cells[2].Text;

                if (e.CommandName == "VerStock")// || e.CommandName == "VerStockEC")
                {
                    if (mID.Equals(""))
                    {
                        Session["Mensaje"] = "Código de material inválido.";
                    }
                    else
                    {
                        StockBE objStock = new StockBE();
                        objStock.CodMaterial = mID;
                        if (cmbCentro.Text != string.Empty)
                        {
                            objStock.CodCentro = cmbCentro.SelectedValue;
                        }
                        if (cmbAlmacen.Text != string.Empty)
                        {
                            objStock.CodAlmacen = cmbAlmacen.SelectedValue;
                        }

                        if (!cmbOrgVentas.Text.Equals(string.Empty))
                        {
                            objStock.OrgVentas = cmbOrgVentas.Text;
                        }
                        if (!cmbCanalDist.Text.Equals(string.Empty))
                        {
                            objStock.CanalDist = cmbCanalDist.Text;
                        }

                        List<StockBE> lstStock = new List<StockBE>(), lstStockEC;// = ParametroBC.Instance.getDataLotes(mID, 0m, cmbCentro.SelectedValue, cmbAlmacen.SelectedValue, "", "", "", cmbOrgVentas.Text, cmbCanalDist.Text);
                        string fecImpStr = string.Empty; string uMedida = string.Empty; DateTime fecImp = new DateTime(); decimal cantImp = 0m;
                        //--------------------------------------------------------------------
                        //if (e.CommandName == "VerStockEC") 
                        //{ 
                        //    lstStock = StockBC.Instance.buscarStockEC(objStock); 
                        //}
                        //else 
                        if (e.CommandName == "VerStock")
                        {
                            lstStock = ParametroBC.Instance.getDataLotes(mID, 0m, cmbCentro.SelectedValue, cmbAlmacen.SelectedValue, "", "", "", cmbOrgVentas.SelectedValue, cmbCanalDist.SelectedValue);
                            //SI EL USUARIO ES DISTRIBUIDOR ENTONCES NO LLAMAMOS A buscarStockEC
                            if (Session["usuarioDistribucion"] != null)
                            {
                                if (Session["usuarioDistribucion"].ToString() != "ok")
                                {
                                    lstStockEC = StockBC.Instance.buscarStockEC(objStock);
                                    foreach (StockBE obj in lstStockEC)
                                    {
                                        if (obj.FechaStock >= DateTime.Today)
                                        {
                                            fecImp = obj.FechaStock;
                                            cantImp = obj.StockDisponible;
                                            uMedida = obj.UMB;
                                            break;
                                        }
                                    }
                                    fecImpStr = string.Format("{0:dd/MM/yyyy}", fecImp);
                                }
                            }
                            

                            string charStockMax = ParametroBC.Instance.getParamValue("stockMayor");
                            //validamos que sea un usuario de distribucion
                            if (Session["usuarioDistribucion"] != null)
                            {
                                if (Session["usuarioDistribucion"].ToString() == "ok")
                                {
                                    foreach (StockBE item in lstStock)
                                    {
                                        item.sStockDisponible = (item.StockDisponible > Convert.ToDecimal(charStockMax)) ? "> " + charStockMax : item.StockDisponible.ToString();
                                    }
                                }
                                else
                                {
                                    foreach (StockBE item in lstStock)
                                    {
                                        item.sStockDisponible = item.StockDisponible.ToString();
                                    }
                                }
                            }
                        }

                        //---------------------------------------------
                        //Solo queda un nombre por centro
                        for (int i = 0; i < lstStock.Count - 1; i++)
                        {
                            string DescCentro = lstStock[i].DescCentro;
                            for (int j = i + 1; j <= lstStock.Count - 1; j++)//elimino los nombres de los centros repetidos
                            {
                                if (DescCentro.Equals(lstStock[j].DescCentro))
                                    lstStock[j].DescCentro = "";
                                else
                                    break;
                            }
                            string DescAlmacen = lstStock[i].DescAlmacen;
                            for (int j = i + 1; j <= lstStock.Count - 1; j++)//elimino los nombres de los Desc de Almacen repetidos
                            {
                                if (DescAlmacen.Equals(lstStock[j].DescAlmacen) && lstStock[i].CodCentro.Equals(lstStock[j].CodCentro))
                                    lstStock[j].DescAlmacen = "";
                                else
                                    DescAlmacen = lstStock[j].DescAlmacen;
                            }
                        }
                       
                        //--------------------------------------------------------------------
                        if (lstStock.Count > 0)
                        {
                            string mDesc = lstStock[0].DescMaterial;
                            decimal tDisp = lstStock.Sum(X => X.StockDisponible);

                            if (e.CommandName == "VerStock")
                            {
                                if (cantImp > 0m)
                                {
                                    lblStockEC.Text = string.Format("IMPORTACIÓN POR LLEGAR AL {0} : {1} {2}", fecImpStr, cantImp, uMedida);
                                }
                                lblVerStock.Text = "Stock " + mID + " \"" + mDesc + "\"" + " Disponible Total = " + tDisp.ToString();
                                this.resetTotalesStock();
                                gvStock.ShowFooter = true;
                                gvStock.DataSource = lstStock;
                                gvStock.DataBind();
                                upVerStock.Update();
                                popUpVerStock.Show();
                            }
                            //else if (e.CommandName == "VerStockEC")
                            //{
                            //    lblVerStockEC.Text = "Detalle de Stock en curso - Mat: " + mID;
                            //    gvStockEC.DataSource = lstStock;
                            //    gvStockEC.DataBind();
                            //    upVerStockEC.Update();
                            //    popUpVerStockEC.Show();
                            //}
                        }
                        else
                        {
                            lblVerStock.Text = "No se encontró información para el material: " + mID;
                            Session["Mensaje"] = lblVerStock.Text;
                        }
                    }
                }
                else if (e.CommandName == "AddItem")
                {
                    if (Session["Cliente"] == null)
                    {
                        Session["Mensaje"] = "Debe indicar el solicitante antes de añadir los materiales.";
                    }
                    else
                    {
                        decimal cant = 1m;
                        List<EnlaceMaterialBE> lstEMat = MaterialBC.Instance.buscarMaterialesAdicionales(mID, "");
                        Session["ObjEnla"] = lstEMat;
                        this._lvObjPedido = (PedidoBE)Session["Pedido"];
                        if (lstEMat.Count > 0 && !ParametroBC.Instance.esTipoOferta(_lvObjPedido.CodTipoDoc))
                        {
                            //this.llenaDataAdic(lstEMat);
                            Session["pagAnt"] = "Stock.aspx";
                            Response.Redirect("MatSubcontrata.aspx");
                        }
                        else
                        {
                            string retVal = this.addItem(mID, cant);
                            if (retVal.Equals(""))
                            {
                                this._lvObjPedido = (PedidoBE)Session["Pedido"];
                                if (this._lvObjPedido.Detalle.Count > 0) { dlMaterialesSelec.ShowFooter = false; }
                                dlMaterialesSelec.DataSource = this._lvObjPedido.Detalle;
                                dlMaterialesSelec.DataBind();
                                upMaterialesSelec.Update();
                            }
                            else
                            {
                                //mensaje de error
                                Session["Mensaje"] = retVal;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Session["Mensaje"] = ex.Message;
            }
            finally
            {
                ((Site2)Master).muestraMensajes();
            }
        }

        protected void dlMaterialesSelec_ItemCommand(object source, DataListCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "DelItem")
                {
                    HiddenField hid2 = (HiddenField)e.Item.FindControl("hidMaterialId");
                    string mID = hid2.Value;

                    List<DetalleBE> lstMateriales;
                    this._lvObjPedido = (PedidoBE)Session["Pedido"];
                    lstMateriales = (this._lvObjPedido.Detalle == null) ? new List<DetalleBE>() : this._lvObjPedido.Detalle;

                    // agregar logica para borrar el combo y no borrar los items
                    string tmpTipoPos = lstMateriales[e.Item.ItemIndex].TipoPosicion;
                    if (!ParametroBC.Instance.esTipoPosCombo(tmpTipoPos))
                    {
                        lstMateriales.RemoveAll(X => X.PosSup == lstMateriales[e.Item.ItemIndex].Posicion);
                        lstMateriales.RemoveAt(e.Item.ItemIndex);
                    }
                    else
                    {
                        Session["Mensaje"] = "No se pueden borrar los componentes del Combo";
                    }
                    this._lvObjPedido.Detalle = lstMateriales;
                    Session["Pedido"] = this._lvObjPedido;

                    dlMaterialesSelec.ShowFooter = false;
                    if (lstMateriales.Count == 0) { dlMaterialesSelec.ShowFooter = true; }
                    dlMaterialesSelec.DataSource = lstMateriales;
                    dlMaterialesSelec.DataBind();
                }
            }
            catch (Exception ex)
            {
                Session["Mensaje"] = ex.Message;
            }
            finally
            {
                ((Site2)Master).muestraMensajes();
                upMaterialesSelec.Update();
            }
        }

        protected void dlMateriales_ItemCommand(object source, DataListCommandEventArgs e)
        {
            if (e.CommandName == "VerStock")
            {
                HiddenField hid = (HiddenField)e.Item.FindControl("hidMaterialId");
                Label lblMat = (Label)e.Item.FindControl("Label2");
                Label lblUM = (Label)e.Item.FindControl("Label4");
                string mID = hid.Value;

                StockBE objStock = new StockBE();
                objStock.CodMaterial = mID;
                if (cmbCentro.Text != string.Empty)
                {
                    objStock.CodCentro = cmbCentro.SelectedValue;
                }
                if (cmbAlmacen.Text != string.Empty)
                {
                    objStock.CodAlmacen = cmbAlmacen.SelectedValue;
                }
                List<StockBE> lstStock = StockBC.Instance.buscarStock(objStock);

                if (lstStock.Count > 0)
                {
                    lblVerStock.Text = "Detalle de Stock - Mat: " + mID;
                }
                else
                {
                    lblVerStock.Text = "No se encontró información para el material: " + mID;
                }

                this.resetTotalesStock();
                gvStock.ShowFooter = true;
                gvStock.DataSource = lstStock;
                gvStock.DataBind();
                //if (lstStock.Count == 0) { dlStock.ShowFooter = false; }
                upVerStock.Update();

                popUpVerStock.Show();
            }
            //else if (e.CommandName == "VerStockEC")
            //{
            //    HiddenField hid = (HiddenField)e.Item.FindControl("hidMaterialId");
            //    Label lblMat = (Label)e.Item.FindControl("Label2");
            //    Label lblUM = (Label)e.Item.FindControl("Label4");
            //    string mID = hid.Value;

            //    StockBE objStock = new StockBE();
            //    objStock.CodMaterial = mID;
            //    if (cmbCentro.Text != string.Empty)
            //    {
            //        objStock.CodCentro = cmbCentro.SelectedValue;
            //    }
            //    if (cmbAlmacen.Text != string.Empty)
            //    {
            //        objStock.CodAlmacen = cmbAlmacen.SelectedValue;
            //    }
            //    List<StockBE> lstStockEC = StockBC.Instance.buscarStockEC(objStock);

            //    if (lstStockEC.Count > 0)
            //    {
            //        lblVerStockEC.Text = "Detalle de Stock en Curso - Mat: " + mID;
            //    }
            //    else
            //    {
            //        lblVerStockEC.Text = "No se encontró información para el material: " + mID;
            //    }

            //    gvStockEC.ShowFooter = true;
            //    gvStockEC.DataSource = lstStockEC;
            //    gvStockEC.DataBind();
            //    upVerStockEC.Update();
            //    popUpVerStockEC.Show();
            //}
        }

        private void resetTotalesStock()
        {
            _totStockDisponible = 0m;
            _totStockDisponible = 0m; _totStockEnTransito = 0m;
        }

        protected void lnkBuscarStock_Click(object sender, EventArgs e)
        {
            StockBE objStock = new StockBE();
            objStock.CodMaterial = "";
            if (cmbCentro.Text != string.Empty)
            {
                objStock.CodCentro = cmbCentro.SelectedValue;
            }
            if (cmbAlmacen.Text != string.Empty)
            {
                objStock.CodAlmacen = cmbAlmacen.SelectedValue;
            }
            if (!cmbOrgVentas.Text.Equals(string.Empty))
            {
                objStock.OrgVentas = cmbOrgVentas.Text;
            }
            if (!cmbCanalDist.Text.Equals(string.Empty))
            {
                objStock.CanalDist = cmbCanalDist.Text;
            }
            objStock.Jerarquia = tvJerarquia.SelectedValue.Split(':')[0];
            List<StockBE> lstStock = StockBC.Instance.buscarStock(objStock);

            lblVerStock.Text = "Detalle de Stock General";

            this.resetTotalesStock();
            gvStock.ShowFooter = false;
            gvStock.DataSource = lstStock;
            gvStock.DataBind();
            //if (lstStock.Count == 0) { dlStock.ShowFooter = false; }

            upVerStock.Update();
            popUpVerStock.Show();
        }

        protected void gvStock_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                this._totStockDisponible += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "StockDisponible"));
                this._totStockLibre += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "StockLibre"));
                this._totStockPedidoCliente += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "StockPedidoCliente"));
                this._totStockEntregaCliente += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "StockEntregaCliente"));
                this._totStockEnTransito += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "StockEnTransito"));
            }
            else if (e.Row.RowType == DataControlRowType.Footer)
            {
                string charStockMax = ParametroBC.Instance.getParamValue("stockMayor");
                //validamos que sea un usuario de distribucion
                if (Session["usuarioDistribucion"] != null)
                {
                    if (Session["usuarioDistribucion"].ToString() == "ok")
                    {
                        e.Row.Cells[3].Text = (this._totStockDisponible > Convert.ToDecimal(charStockMax)) ? "> " + charStockMax : string.Format("{0:0,0.000}", _totStockDisponible);
                    }
                    else
                    {
                        e.Row.Cells[3].Text = string.Format("{0:0,0.000}", this._totStockDisponible);
                    }
                }

                //e.Row.Cells[3].Text = string.Format("{0:0,0.000}", this._totStockDisponible);
                e.Row.Cells[3].HorizontalAlign = HorizontalAlign.Right;
				/*
                e.Row.Cells[5].HorizontalAlign = HorizontalAlign.Right;

                e.Row.Cells[6].Text = string.Format("{0:n}", this._totStockPedidoCliente);
                e.Row.Cells[6].HorizontalAlign = HorizontalAlign.Right;

                e.Row.Cells[7].Text = string.Format("{0:n}", this._totStockEntregaCliente);
                e.Row.Cells[7].HorizontalAlign = HorizontalAlign.Right;

                e.Row.Cells[8].Text = string.Format("{0:n}", this._totStockEnTransito);
                e.Row.Cells[8].HorizontalAlign = HorizontalAlign.Right;*/
             }
        }
    }
}
